<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Color 4: Resolving keyword color values</title>
<link rel="author" title="Chris Nardi" href="mailto:csnardi1@gmail.com">
<link rel="help" href="https://drafts.csswg.org/css-color-4/#resolving-color-values">
<meta name="assert" content="Tests if keyword color values are resolved properly">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<div id="parent" style="color: rgb(45, 23, 27)">
    <div id="inner"></div>
</div>

<script>
    function color_test(color, expected, reason) {
        test(function() {
            var element = document.getElementById('inner');
            // Random value not in our test data.
            fail_value = "rgb(12, 34, 223)"
            element.style.color = "black";
            element.style.cssText = "color: " + fail_value + "; color: " + color;

            if (expected === null)
                assert_equals(getComputedStyle(element).color, fail_value);
            else
                assert_equals(getComputedStyle(element).color, expected);
        }, `${reason}: ${color}`);
    }

    function expected_value(rgb_channels) {
        if (rgb_channels === null)
            return null;
        else if (rgb_channels.length === 3 || rgb_channels[3] == 1)
            return "rgb(" + rgb_channels.slice(0, 3).join(", ") + ")";
        else
            return "rgba(" + rgb_channels.join(", ") + ")";
    }

    keywords = [
        ['transparent', [0, 0, 0, 0]],
        ['aliceblue', [240, 248, 255, 1]],
        ['antiquewhite', [250, 235, 215, 1]],
        ['aqua', [0, 255, 255, 1]],
        ['aquamarine', [127, 255, 212, 1]],
        ['azure', [240, 255, 255, 1]],
        ['beige', [245, 245, 220, 1]],
        ['bisque', [255, 228, 196, 1]],
        ['black', [0, 0, 0, 1]],
        ['blanchedalmond', [255, 235, 205, 1]],
        ['blue', [0, 0, 255, 1]],
        ['blueviolet', [138, 43, 226, 1]],
        ['brown', [165, 42, 42, 1]],
        ['burlywood', [222, 184, 135, 1]],
        ['cadetblue', [95, 158, 160, 1]],
        ['chartreuse', [127, 255, 0, 1]],
        ['chocolate', [210, 105, 30, 1]],
        ['coral', [255, 127, 80, 1]],
        ['cornflowerblue', [100, 149, 237, 1]],
        ['cornsilk', [255, 248, 220, 1]],
        ['crimson', [220, 20, 60, 1]],
        ['cyan', [0, 255, 255, 1]],
        ['darkblue', [0, 0, 139, 1]],
        ['darkcyan', [0, 139, 139, 1]],
        ['darkgoldenrod', [184, 134, 11, 1]],
        ['darkgray', [169, 169, 169, 1]],
        ['darkgreen', [0, 100, 0, 1]],
        ['darkgrey', [169, 169, 169, 1]],
        ['darkkhaki', [189, 183, 107, 1]],
        ['darkmagenta', [139, 0, 139, 1]],
        ['darkolivegreen', [85, 107, 47, 1]],
        ['darkorange', [255, 140, 0, 1]],
        ['darkorchid', [153, 50, 204, 1]],
        ['darkred', [139, 0, 0, 1]],
        ['darksalmon', [233, 150, 122, 1]],
        ['darkseagreen', [143, 188, 143, 1]],
        ['darkslateblue', [72, 61, 139, 1]],
        ['darkslategray', [47, 79, 79, 1]],
        ['darkslategrey', [47, 79, 79, 1]],
        ['darkturquoise', [0, 206, 209, 1]],
        ['darkviolet', [148, 0, 211, 1]],
        ['deeppink', [255, 20, 147, 1]],
        ['deepskyblue', [0, 191, 255, 1]],
        ['dimgray', [105, 105, 105, 1]],
        ['dimgrey', [105, 105, 105, 1]],
        ['dodgerblue', [30, 144, 255, 1]],
        ['firebrick', [178, 34, 34, 1]],
        ['floralwhite', [255, 250, 240, 1]],
        ['forestgreen', [34, 139, 34, 1]],
        ['fuchsia', [255, 0, 255, 1]],
        ['gainsboro', [220, 220, 220, 1]],
        ['ghostwhite', [248, 248, 255, 1]],
        ['gold', [255, 215, 0, 1]],
        ['goldenrod', [218, 165, 32, 1]],
        ['gray', [128, 128, 128, 1]],
        ['green', [0, 128, 0, 1]],
        ['greenyellow', [173, 255, 47, 1]],
        ['grey', [128, 128, 128, 1]],
        ['honeydew', [240, 255, 240, 1]],
        ['hotpink', [255, 105, 180, 1]],
        ['indianred', [205, 92, 92, 1]],
        ['indigo', [75, 0, 130, 1]],
        ['ivory', [255, 255, 240, 1]],
        ['khaki', [240, 230, 140, 1]],
        ['lavender', [230, 230, 250, 1]],
        ['lavenderblush', [255, 240, 245, 1]],
        ['lawngreen', [124, 252, 0, 1]],
        ['lemonchiffon', [255, 250, 205, 1]],
        ['lightblue', [173, 216, 230, 1]],
        ['lightcoral', [240, 128, 128, 1]],
        ['lightcyan', [224, 255, 255, 1]],
        ['lightgoldenrodyellow', [250, 250, 210, 1]],
        ['lightgray', [211, 211, 211, 1]],
        ['lightgreen', [144, 238, 144, 1]],
        ['lightgrey', [211, 211, 211, 1]],
        ['lightpink', [255, 182, 193, 1]],
        ['lightsalmon', [255, 160, 122, 1]],
        ['lightseagreen', [32, 178, 170, 1]],
        ['lightskyblue', [135, 206, 250, 1]],
        ['lightslategray', [119, 136, 153, 1]],
        ['lightslategrey', [119, 136, 153, 1]],
        ['lightsteelblue', [176, 196, 222, 1]],
        ['lightyellow', [255, 255, 224, 1]],
        ['lime', [0, 255, 0, 1]],
        ['limegreen', [50, 205, 50, 1]],
        ['linen', [250, 240, 230, 1]],
        ['magenta', [255, 0, 255, 1]],
        ['maroon', [128, 0, 0, 1]],
        ['mediumaquamarine', [102, 205, 170, 1]],
        ['mediumblue', [0, 0, 205, 1]],
        ['mediumorchid', [186, 85, 211, 1]],
        ['mediumpurple', [147, 112, 219, 1]],
        ['mediumseagreen', [60, 179, 113, 1]],
        ['mediumslateblue', [123, 104, 238, 1]],
        ['mediumspringgreen', [0, 250, 154, 1]],
        ['mediumturquoise', [72, 209, 204, 1]],
        ['mediumvioletred', [199, 21, 133, 1]],
        ['midnightblue', [25, 25, 112, 1]],
        ['mintcream', [245, 255, 250, 1]],
        ['mistyrose', [255, 228, 225, 1]],
        ['moccasin', [255, 228, 181, 1]],
        ['navajowhite', [255, 222, 173, 1]],
        ['navy', [0, 0, 128, 1]],
        ['oldlace', [253, 245, 230, 1]],
        ['olive', [128, 128, 0, 1]],
        ['olivedrab', [107, 142, 35, 1]],
        ['orange', [255, 165, 0, 1]],
        ['orangered', [255, 69, 0, 1]],
        ['orchid', [218, 112, 214, 1]],
        ['palegoldenrod', [238, 232, 170, 1]],
        ['palegreen', [152, 251, 152, 1]],
        ['paleturquoise', [175, 238, 238, 1]],
        ['palevioletred', [219, 112, 147, 1]],
        ['papayawhip', [255, 239, 213, 1]],
        ['peachpuff', [255, 218, 185, 1]],
        ['peru', [205, 133, 63, 1]],
        ['pink', [255, 192, 203, 1]],
        ['plum', [221, 160, 221, 1]],
        ['powderblue', [176, 224, 230, 1]],
        ['purple', [128, 0, 128, 1]],
        ['red', [255, 0, 0, 1]],
        ['rosybrown', [188, 143, 143, 1]],
        ['royalblue', [65, 105, 225, 1]],
        ['saddlebrown', [139, 69, 19, 1]],
        ['salmon', [250, 128, 114, 1]],
        ['sandybrown', [244, 164, 96, 1]],
        ['seagreen', [46, 139, 87, 1]],
        ['seashell', [255, 245, 238, 1]],
        ['sienna', [160, 82, 45, 1]],
        ['silver', [192, 192, 192, 1]],
        ['skyblue', [135, 206, 235, 1]],
        ['slateblue', [106, 90, 205, 1]],
        ['slategray', [112, 128, 144, 1]],
        ['slategrey', [112, 128, 144, 1]],
        ['snow', [255, 250, 250, 1]],
        ['springgreen', [0, 255, 127, 1]],
        ['steelblue', [70, 130, 180, 1]],
        ['tan', [210, 180, 140, 1]],
        ['teal', [0, 128, 128, 1]],
        ['thistle', [216, 191, 216, 1]],
        ['tomato', [255, 99, 71, 1]],
        ['turquoise', [64, 224, 208, 1]],
        ['violet', [238, 130, 238, 1]],
        ['wheat', [245, 222, 179, 1]],
        ['white', [255, 255, 255, 1]],
        ['whitesmoke', [245, 245, 245, 1]],
        ['yellow', [255, 255, 0, 1]],
        ['yellowgreen', [154, 205, 50, 1]],
    ]

    for (var value in keywords) {
        items_to_test = keywords[value];
        keyword = items_to_test[0];
        expected = expected_value(items_to_test[1]);
        letter = value % keyword.length;
        replacement = keyword;

        color_test(keyword, expected, "Keyword should parse properly");
        color_test(keyword.toUpperCase(), expected, "Keywords should be case-insensitive");
        replacement[letter] = "\\" + keyword.codePointAt(letter);
        color_test(replacement, expected, "Code point should parse");
        color_test(keyword.slice(0, letter) + keyword.slice(letter + 1, keyword.length), null, "Partial keywords shouldn't parse");
        if (keyword.indexOf('k') !== -1)
            color_test(keyword.replace('k', 'K'), null, "Unicode modification shouldn't parse");
    }
</script>
